package com.specter.dev.docs.execute;

import java.io.File;
import java.io.IOException;

import com.specter.dev.docs.builder.GenConfiguration.JApiOutput;
import com.specter.dev.docs.builder.GenConfiguration.JApiOutputFile;
import com.specter.utils.FreemarkerUtils;
import com.specter.utils.StringUtils;

import org.apache.commons.io.FileUtils;

import lombok.extern.slf4j.Slf4j;

/**
 * Note:默认的写文件的实现类
 * 
 * @author Liang.Wang
 * @version Mar 23, 2017
 */
@Slf4j
public class JApiOutputExeDefault implements JApiOutputExe {
	protected static final String DEFAULT_FTL = "com/specter/dev/docs/template";

	@Override
	public void output(JApiOutput output, DataModel data) {

		// 1.逐个对象创建文件
		for (JApiOutputFile file : output.getFiles()) {
			String mName = data.meta("name").toString();// 模块名称
			String fBase = pkg2dir(output.getBase(), output.getPkg(), mName, file.getPkg());
			String fName = fileName(String.format(file.getName(), mName + "-" + data.meta("version")));// 加版本显示

			data.file("file_pkge", output.getPkg() + "." + mName + "." + file.getPkg());// java文件包
			data.file("file_name", fName.substring(0, fName.lastIndexOf(".")));// java类名
			data.file("file_path", fBase + fName);// 文件全路径（含后缀的）

			this.output(file, data);
		}
	}

	/**
	 * 将一个实体信息转换到一个输出文件
	 * 
	 * @param output 输出配置
	 * 
	 * @param data   单个实体对象数据Map
	 * 
	 */
	public void output(JApiOutputFile file, DataModel data) {
		try {
			String ftl = file.getFtl().replace("_DEFAULT", DEFAULT_FTL);
			String content = FreemarkerUtils.render(ftl, data.toMap());

			String f = dir(data.file("file_path").toString());

			FileUtils.writeStringToFile(new java.io.File(f), content, "UTF-8");// 自动创建上级文件夹

			log.info("文件：{} 生成成功！", data.file("file_path"));

		} catch (IOException e) {
			log.error("make directory or make file failed!");
			e.printStackTrace();
		}
	}

	// 拼接dir路径
	private String pkg2dir(String... dirs) {
		StringBuilder sb = new StringBuilder("");
		for (String dir : dirs) {
			if (StringUtils.isNotBlank(dir)) {
				sb.append(dir.replace('.', '/')).append("/");
			}
		}
		return sb.toString();
	}

	// 识别绝对路径
	private String dir(String file) {
		String dir = file;
		if (file.startsWith("src/main/resources/static")) {
			dir = System.getProperty("user.dir") + File.separator + file;

		} else if (file.startsWith("dir:")) {
			dir = file.replace("dir:", System.getProperty("user.dir"));
		}
		return dir;
	}

	// 转化文件名称
	private String fileName(String fileName) {
		if (fileName.endsWith(".java")) {
			fileName = Character.toUpperCase(fileName.charAt(0)) + fileName.substring(1); // 首字母大写
		} else {// 其他的全部变为单词间用'-
			fileName = StringUtils.toViewName(fileName);// 变为 '-'
		}
		return fileName;
	}
}
